package com.cskaoyan.day6._01_homeworkreview;

import java.util.HashMap;
import java.util.Map;

/**
 * 1, 给定一个字符串数组 words 和一个字符串 chars.
 * 如果一个字符串能被 chars 里面的字符组成，那么这个字符串就是"好"的(chars里面每个字符只能使用一次)。
 * 求：words 里面所有好的字符串的字符总个数。
 * <p>
 * 比如：
 * words = ["cat", "bt", "hat", "tree"]
 * chars = "atach"
 * <p>
 * 好的字符串有 "cat", "hat", 3 + 3 = 6.
 * 输出：6
 *
 * @author Common-zhou
 * @since 2023-03-04 09:30
 */
public class Homework1 {
    public static void main(String[] args) {
        //words = ["cat", "bt", "hat", "tree"]
        //chars = "atach"

        // cataa
        // atach

        String actualWord = "caaat";
        String chars = "atach";

        // 是否是个好单词。

        String[] words = {"cat", "bt", "hat", "tree"};

        int count = 0;

        for (int i = 0; i < words.length; i++) {
            String word = words[i];
            boolean flag = isGoodWord(word, chars);

            if (flag) {
                // 是一个好单词
                count += word.length();
                System.out.println(word);
            }

        }


        System.out.println(count);


    }

    /**
     * @param actualWord 实际的单词，需要判断。比如 cat  hat
     * @param chars      我给的总的单词
     * @return 是否是个好单词
     */
    private static boolean isGoodWord(String actualWord, String chars) {

        // Map
        // 你需要记录  chars里面字符及出现的次数
        // key=Character类型。value是Integer。该字符出现的次数
        Map<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < chars.length(); i++) {
            char c = chars.charAt(i);

            Integer count = map.get(c);
            if (count != null) {
                map.put(c, count + 1);
            } else {
                map.put(c, 1);
            }
        }

        // atach
        // a,2  c,1 t,1 h,1
        //System.out.println(map);

        //{a=2, c=1, t=1, h=1}
        for (int i = 0; i < actualWord.length(); i++) {
            char c = actualWord.charAt(i);

            Integer count = map.get(c);
            // count有几种情况
            // null, 返回次数
            if (count == null || count <= 0) {
                // 不是一个好的
                return false;
            }

            map.put(c, count - 1);
        }

        return true;
    }
}
